//+------------------------------------------------------------------+
//|                                                   Oscilators.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.h"

//+------------------------------------------------------------------+
//| 平均真实波幅指标类 (Average True Range)                          |
//| 用途：实现"平均真实波幅"指标                                     |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiATR : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiATR(void);
   
   /** 析构函数 */
   ~CiATR(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 熊市力量指标类 (Bears Power)                                     |
//| 用途：实现"熊市力量"指标                                         |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiBearsPower : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiBearsPower(void);
   
   /** 析构函数 */
   ~CiBearsPower(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 牛市力量指标类 (Bulls Power)                                     |
//| 用途：实现"牛市力量"指标                                         |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiBullsPower : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiBullsPower(void);
   
   /** 析构函数 */
   ~CiBullsPower(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 商品通道指数指标类 (Commodity Channel Index)                     |
//| 用途：实现"商品通道指数"指标                                     |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiCCI : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiCCI(void);
   
   /** 析构函数 */
   ~CiCCI(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, 
                            const int ma_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int ma_period, const int applied);
};

//+------------------------------------------------------------------+
//| 蔡金振荡器指标类 (Chaikin Oscillator)                            |
//| 用途：实现"蔡金振荡器"指标                                       |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiChaikin : public CIndicator
{
protected:
   int               m_fast_ma_period;   // 快速移动平均周期
   int               m_slow_ma_period;   // 慢速移动平均周期
   ENUM_MA_METHOD    m_ma_method;        // 移动平均方法
   ENUM_APPLIED_VOLUME m_applied;        // 应用成交量类型

public:
   /** 构造函数 */
   CiChaikin(void);
   
   /** 析构函数 */
   ~CiChaikin(void);
   
   /** 获取快速移动平均周期 */
   int               FastMaPeriod(void) const;
   
   /** 获取慢速移动平均周期 */
   int               SlowMaPeriod(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ma_period 快速移动平均周期
    * @param slow_ma_period 慢速移动平均周期
    * @param ma_method 移动平均方法
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int fast_ma_period, const int slow_ma_period,
                            const ENUM_MA_METHOD ma_method, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ma_period 快速移动平均周期
    * @param slow_ma_period 慢速移动平均周期
    * @param ma_method 移动平均方法
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int fast_ma_period, const int slow_ma_period,
                                const ENUM_MA_METHOD ma_method, const ENUM_APPLIED_VOLUME applied);
};

//+------------------------------------------------------------------+
//| 德马克指标类 (DeMarker)                                         |
//| 用途：实现"德马克"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiDeMarker : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiDeMarker(void);
   
   /** 析构函数 */
   ~CiDeMarker(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 强力指数指标类 (Force Index)                                     |
//| 用途：实现"强力指数"指标                                         |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiForce : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   ENUM_MA_METHOD    m_ma_method;        // 移动平均方法
   ENUM_APPLIED_VOLUME m_applied;      // 应用成交量类型

public:
   /** 构造函数 */
   CiForce(void);
   
   /** 析构函数 */
   ~CiForce(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_method 移动平均方法
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const ENUM_MA_METHOD ma_method, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param ma_method 移动平均方法
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const ENUM_MA_METHOD ma_method, const ENUM_APPLIED_VOLUME applied);
};

//+------------------------------------------------------------------+
//| MACD指标类 (Moving Averages Convergence-Divergence)             |
//| 用途：实现"移动平均收敛发散"指标                                 |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiMACD : public CIndicator
{
protected:
   int               m_fast_ema_period;  // 快速EMA周期
   int               m_slow_ema_period;  // 慢速EMA周期
   int               m_signal_period;    // 信号线周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiMACD(void);
   
   /** 析构函数 */
   ~CiMACD(void);
   
   /** 获取快速EMA周期 */
   int               FastEmaPeriod(void) const;
   
   /** 获取慢速EMA周期 */
   int               SlowEmaPeriod(void) const;
   
   /** 获取信号线周期 */
   int               SignalPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param signal_period 信号线周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int fast_ema_period, const int slow_ema_period,
                            const int signal_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /**
    * 获取信号线缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Signal(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param signal_period 信号线周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int fast_ema_period, const int slow_ema_period,
                                const int signal_period, const int applied);
};

//+------------------------------------------------------------------+
//| 动量指标类 (Momentum)                                            |
//| 用途：实现"动量"指标                                             |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiMomentum : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiMomentum(void);
   
   /** 析构函数 */
   ~CiMomentum(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, 
                            const int ma_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int ma_period, const int applied);
};

//+------------------------------------------------------------------+
//| MACD柱状图指标类 (Moving Average of Oscillator)                  |
//| 用途：实现"移动平均振荡器(MACD柱状图)"指标                       |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiOsMA : public CIndicator
{
protected:
   int               m_fast_ema_period;  // 快速EMA周期
   int               m_slow_ema_period;  // 慢速EMA周期
   int               m_signal_period;    // 信号线周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiOsMA(void);
   
   /** 析构函数 */
   ~CiOsMA(void);
   
   /** 获取快速EMA周期 */
   int               FastEmaPeriod(void) const;
   
   /** 获取慢速EMA周期 */
   int               SlowEmaPeriod(void) const;
   
   /** 获取信号线周期 */
   int               SignalPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param signal_period 信号线周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int fast_ema_period, const int slow_ema_period,
                            const int signal_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param fast_ema_period 快速EMA周期
    * @param slow_ema_period 慢速EMA周期
    * @param signal_period 信号线周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int fast_ema_period, const int slow_ema_period,
                                const int signal_period, const int applied);
};

//+------------------------------------------------------------------+
//| 相对强弱指数指标类 (Relative Strength Index)                     |
//| 用途：实现"相对强弱指数"指标                                     |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiRSI : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiRSI(void);
   
   /** 析构函数 */
   ~CiRSI(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, 
                            const int ma_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int ma_period, const int applied);
};

//+------------------------------------------------------------------+
//| 相对活力指数指标类 (Relative Vigor Index)                        |
//| 用途：实现"相对活力指数"指标                                     |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiRVI : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期

public:
   /** 构造函数 */
   CiRVI(void);
   
   /** 析构函数 */
   ~CiRVI(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /**
    * 获取信号线缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Signal(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};

//+------------------------------------------------------------------+
//| 随机振荡器指标类 (Stochastic Oscillator)                         |
//| 用途：实现"随机振荡器"指标                                       |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiStochastic : public CIndicator
{
protected:
   int               m_Kperiod;          // %K线周期
   int               m_Dperiod;          // %D线周期
   int               m_slowing;          // 平滑周期
   ENUM_MA_METHOD    m_ma_method;        // 移动平均方法
   ENUM_STO_PRICE    m_price_field;      // 价格字段

public:
   /** 构造函数 */
   CiStochastic(void);
   
   /** 析构函数 */
   ~CiStochastic(void);
   
   /** 获取%K线周期 */
   int               Kperiod(void) const;
   
   /** 获取%D线周期 */
   int               Dperiod(void) const;
   
   /** 获取平滑周期 */
   int               Slowing(void) const;
   
   /** 获取移动平均方法 */
   ENUM_MA_METHOD    MaMethod(void) const;
   
   /** 获取价格字段 */
   ENUM_STO_PRICE    PriceField(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param Kperiod %K线周期
    * @param Dperiod %D线周期
    * @param slowing 平滑周期
    * @param ma_method 移动平均方法
    * @param price_field 价格字段
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int Kperiod, const int Dperiod, const int slowing,
                            const ENUM_MA_METHOD ma_method, const ENUM_STO_PRICE price_field);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /**
    * 获取信号线缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Signal(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param Kperiod %K线周期
    * @param Dperiod %D线周期
    * @param slowing 平滑周期
    * @param ma_method 移动平均方法
    * @param price_field 价格字段
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int Kperiod, const int Dperiod, const int slowing,
                                const ENUM_MA_METHOD ma_method, const ENUM_STO_PRICE price_field);
};

//+------------------------------------------------------------------+
//| 威廉百分比范围指标类 (Williams' Percent Range)                   |
//| 用途：实现"威廉百分比范围"指标                                   |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiWPR : public CIndicator
{
protected:
   int               m_calc_period;      // 计算周期

public:
   /** 构造函数 */
   CiWPR(void);
   
   /** 析构函数 */
   ~CiWPR(void);
   
   /** 获取计算周期 */
   int               CalcPeriod(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param calc_period 计算周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const int calc_period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param calc_period 计算周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int calc_period);
};

//+------------------------------------------------------------------+
//| 三重指数移动平均振荡器指标类 (Triple Exponential Moving Averages Oscillator) |
//| 用途：实现"三重指数移动平均振荡器"指标                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiTriX : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   int               m_applied;           // 应用价格类型

public:
   /** 构造函数 */
   CiTriX(void);
   
   /** 析构函数 */
   ~CiTriX(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取应用价格类型 */
   int               Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, 
                            const int ma_period, const int applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用价格类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int ma_period, const int applied);
};
//+------------------------------------------------------------------+